#pragma once

#include "BaseMsgHandler.h"


// 前置声明一些驱动对象，避免此头文件引入过多头文件，导致编译时间增加
class DriverManager;
using DriverManagerPtr = std::shared_ptr<DriverManager>;
class Forker;
using ForkerPtr = std::shared_ptr<Forker>;
class Motor;
using MotorPtr = std::shared_ptr<Motor>;
class IO;
using IOPtr = std::shared_ptr<IO>;



/**
 * @brief 运控控制消息的请求处理对象
 * 
 */
class CtrlMsgHandler : public BaseMsgHandler
{
public:
    CtrlMsgHandler();
    virtual ~CtrlMsgHandler() = default;

    bool Init();

protected:

    virtual bool HandleMsgSub(const std::string& msg) override;

    virtual void CtrlEnable();              // 运动使能控制
    virtual void SetForkHeight();           // 货叉高度控制
    virtual void MotorCtrl();               // 电机控制。
    virtual void LightCtrl();               // 灯光控制

private:
    std::string m_ctrl;

    // 硬件驱动控制相关的对象。
    // 注意：即使初始化后，以下驱动对象可能还是为空。驱动对象是配置在具体agv的配置文件中的。
    DriverManagerPtr m_driverManager = nullptr;     // 驱动管理对象

    ForkerPtr m_forker = nullptr;                   // 货叉驱动对象
    MotorPtr m_motor1 = nullptr;                    // 电机驱动1 对象
    MotorPtr m_motor2 = nullptr;                    // 电机驱动2 对象
    IOPtr m_chargeIO = nullptr;                     // 充电电源驱动对象
    
};